package main

import "encoding/json"

// 初始化
var h = hub{
	c: make(map[*connection]bool),
	u: make(chan *connection),
	b: make(chan []byte),
	r: make(chan *connection),
}

// websocket控制器
// 控制器不断的向其他人发数据
type hub struct {
	// 注册的连接器
	c map[*connection]bool
	// 从连接器发送的消息
	b chan []byte
	// 连接器销毁请求
	r chan *connection // 需要定义成无缓冲管道，数据到后必须要有接收方
	// 连接器注册请求
	u chan *connection
}

// 处理ws的逻辑实现
func (h *hub) run() {
	// 监听数据管道，在后端不断的处理管道数据
	for {
		select {
		case c := <-h.u: // 注册
			// 标识注册了
			h.c[c] = true
			c.data.Ip = c.ws.RemoteAddr().String()
			c.data.Type = "handshake"
			c.data.UserList = user_list
			data_b, _ := json.Marshal(c.data)
			c.sc <- data_b
		case c := <-h.r: // 删除
			if _, ok := h.c[c]; ok {
				delete(h.c, c)
				close(c.sc)
			}
		case data := <-h.b: // 发数据
			// 将数据同步到所有用户
			for c := range h.c {
				select {
				case c.sc <- data:
				default:
					//防止死循环，select一直执行不到就不用阻塞在这占用资源了,直接关闭
					delete(h.c, c)
					close(c.sc)
				}
			}
		}
	}
}
